package com.itxz.utils;

import com.itxz.handler.MyErrorHandler;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

/**
 * Dom工具类，带Schema验证
 *
 * @author ldt
 * @date 2019/12/3 10:24
 */
public class DomSchemaUtils {

    private final static DocumentBuilderFactory dbf;

    static {
        // 初始化DOM文档建造器工厂
        dbf = DocumentBuilderFactory.newInstance();
        // 打开验证特性
        dbf.setValidating(true);
        // 删除元素内容中的可忽略空格
        dbf.setIgnoringElementContentWhitespace(true);

        /*
         * 解析带有Schema的XML文件与DTD类似，但有3点区别
         * 1、必须打开对命名空间的支持，即使在XML文件里你不使用它
         * 2、必须通过以下“魔咒”处理Schema工厂
         * 3、解析器不会丢弃元素中的空白字符（是否是bug，人们看法不一）
         */
        dbf.setNamespaceAware(true);
        final String JAXP_SCHEMA_LANGUAGE="http://java.sun.com/xml/jaxp/properties/schemaLanguage";
        final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
        dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
    }

    /**
     * 获取DOM文档建造器
     *
     * @param: []
     * @return: javax.xml.parsers.DocumentBuilder
     * @auther: ldt
     * @date: 2019/11/29 17:06
     */
    public static DocumentBuilder newDocumentBuilder(){
        try {
            DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
            // 设置错误处理器
            documentBuilder.setErrorHandler(new MyErrorHandler());
            return documentBuilder;
        } catch (ParserConfigurationException e) {
            throw new RuntimeException(e);
        }
    }

}
